#include <stdio.h>
#include <pcap.h>
#define IFSZ 16
#define FLTRSZ 120
#define MAXHOSTSZ 256
#define PCAP_SAVEFILE "./pcap_savefile"
int packets=0;


//modo de empleo

int usage(char *progname){

   printf("Uso: %s <interfaz> [<archivo entrada>]\n",progname);
   exit(7);

}

// print_addrs() escribe las direcciones IP origen y destino del paquete al stdout

void print_addrs(u_char *user, const struct pcap_pkthdr *hdr, const u_char *data)
{
	int offset = 26; //14 MAC header + 12 IP
	if(hdr->caplen < 30){

		//Los datos capturados no son suficientes para extraer la direccion IP
		fprintf(stderr,"Error: El paquete capturado no es lo suficientemente grande para extraer direcciones IP.\n");
		return;

	}
	printf("Paquete recivido desde: %d. %d. %d. %d.\n", data[offset], data[offset+1], data[offset+2], data[offset+3]);

	if( hdr->caplen >= 34) {

		printf("y destinado a %d. %d. %d. %d \n",data[offset+4],data[offset+5],data[offset+6],data[offset+7]);

	}
	packets++;


}

int main(int argc, char **argv)
{
	pcap_t *p;
	char ifname[IFSZ];	//nombre de la interfaz
	char filename[80];	//nombre del savefile a leer
	char errbuf[PCAP_ERRBUF_SIZE];
	char prestr[80];
	int majver =0, minver =0; // versiones

	if(argc < 2)
		usage(argv[0]);

	if(strlen(argv[1]) > IFSZ){

		fprintf(stderr,"Nombre de interfaz invalido\n");
		exit(1);

	}

	strcpy(ifname,argv[1]);

	/*Si no hay un segundo argumento (nombre fichero entrada) se usa el nombre por defecto pcap_savefile */

	if(argc >= 3)
		strcpy(filename,argv[2]);
	else
		strcpy(filename,PCAP_SAVEFILE);

	/*Abre la interfaz para la captura de datos.
	* Debe llamarse antes de capturar cualquier paquete
	*/
	
	if(!(p = pcap_open_offline(filename,errbuf)))
	{

		fprintf(stderr,"Error abriendo el fichero, %s, en modo lectura: %s\n", filename, errbuf);
		exit(2);

	}

	//pcacp_dispach(), por cada paquete lee del savefile hasta error o EOF

	if(pcap_dispatch(p,0,&print_addrs, (char *)0) < 0){
		
		sprintf(prestr,"Error, no puedo leer de la interfaz%s",ifname);
		pcap_perror(p,prestr);
		exit(4);
	}

	printf("\nPaquetes leidos: %d\n", packets);


	//mostramos las versiones en pantalla

	if(!(majver = pcap_major_version(p))){
	
		fprintf(stderr,"Error obteniendo la -mayor version- de la interfaz: %s", ifname);
		exit(5);

	}

	printf("La -mayor version- usada para crear el fichero es: %d. \n", majver);

	if(!(minver = pcap_minor_version(p)))
	{
		fprintf(stderr,"Error obteniendo la -minor version- de la interfaz: %s", ifname);
		exit(6);
	}

	printf("La -minor version-: %d\n", minver);

	pcap_close(p); //Cerramos el dispositivo de captura y la memoria usada por el descriptor




}








